package xc.doughnut.util.old;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * MySQL 代码生成器演示例子
 * </p>
 *
 * @author XuChao
 */
public class MysqlGenerator {

    // 生成xml文件的输出目录
    private final static String OUTPUT_XML_DIR = "/src/main/resources";
    // 作者
    private final static String AUTHOR = "XuChao";

    // 数据源配置
    // 数据库ip
    private final static String DATABASE_IP = "localhost";
    // 数据库名
    private final static String MYSQL_DATABASE_NAME = "reggie";
    // 数据库用户
    private final static String MYSQL_DB_USERNAME = "root";
    // 数据库密码
    private final static String MYSQL_DB_PASSWORD = "2000";
    // MYSQL数据库端口
    private final static String MYSQL_DB_PORT = "3306";
    // 要生成代码的表名 使用`,` 隔开
    private final static String[] TABLE_NAME_LIST = {"dish_flavor"};
    // 设置目录结构,将生成的代码放在该目录下
    private final static String GENERATOR_PARENT_DIR = "com.egintra";
    // 默任包结构
    private static final String CONTROLLER_DEF = "controller";
    private static final String ENTITY_DEF = "entity";
    private static final String MAPPER_DEF = "mapper";
    private static final String SERVICE_IMPL_DEF = "service.impl";
    private static final String SERVICE_DEF = "service";

    /**
     * 运行main方法即可
     * 1.全局配置
     * 2.数据源配置
     * 3.包配置策略
     * 4.策略配置
     * 5.整合配置
     */
    public static void main(String[] args) {

        //获取项目本地磁盘路径
        String projectPath = System.getProperty("user.dir");
        // 全局配置
        GlobalConfig gc = new GlobalConfig();

        //生成java文件的存放位置
        gc.setOutputDir(projectPath + "/src/main/java")
                //作者署名
                .setAuthor(AUTHOR)
                //是否文件覆盖
                .setFileOverride(true)
                //主键策略
                .setIdType(IdType.ID_WORKER)
                .setBaseResultMap(true)
                //生成sql片段
                .setBaseColumnList(true)
                //设置生成service接口是否首字母是I
                .setServiceName("%sService")
                //是否打开输出目录
                .setOpen(false);

        // MySQL
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUrl("jdbc:mysql://" + DATABASE_IP + ":" + MYSQL_DB_PORT + "/" + MYSQL_DATABASE_NAME + "?useUnicode=true&useSSL=false&characterEncoding=utf8")
                .setUsername(MYSQL_DB_USERNAME)
                .setPassword(MYSQL_DB_PASSWORD);
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(GENERATOR_PARENT_DIR)
                .setController(CONTROLLER_DEF)
                .setService(SERVICE_DEF)
                .setServiceImpl(SERVICE_IMPL_DEF)
                .setEntity(ENTITY_DEF)
                .setMapper(MAPPER_DEF);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称 单模块场景
                return projectPath + OUTPUT_XML_DIR + "/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy
                //全局大小写命名
                .setCapitalMode(true)
                //数据库字段是否下划线转驼峰
                .setColumnNaming(NamingStrategy.underline_to_camel)
                //数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true)
                .setInclude(TABLE_NAME_LIST)
                .setControllerMappingHyphenStyle(true)
                .setTablePrefix(pc.getModuleName() + "_");

        // 配置整合 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        //配置信息添加至 全局配置容器
        mpg.setGlobalConfig(gc)
                .setStrategy(strategy)
                .setDataSource(dsc)
                .setPackageInfo(pc)
                .setCfg(cfg)
                .setTemplate(new TemplateConfig().setXml(null))
                // 选择 freemarker 引擎需要指定如下加  pom 依赖必须有！
                .setTemplateEngine(new FreemarkerTemplateEngine())
                .execute();//执行
    }

}
